home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
176-200
/
190
/
nethack
/
twee.zoo
/
write.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-06-28
|
4KB
|
174 lines
/* SCCS Id: @(#)write.c 2.0 87/09/16
*/
#include "hack.h"
extern char pl_character[];
#ifdef MARKER
/*
* returns basecost of a scroll
*/
int
cost(scroll)
register struct obj *scroll;
{
switch(scroll->otyp) {
# ifdef MAIL
case SCR_MAIL:
return(0);
break;
# endif
case SCR_LIGHT:
case SCR_GOLD_DETECTION:
case SCR_FOOD_DETECTION:
case SCR_MAGIC_MAPPING:
case SCR_AMNESIA:
case SCR_FIRE:
return(8);
break;
case SCR_DESTROY_ARMOR:
case SCR_DAMAGE_WEAPON:
case SCR_CREATE_MONSTER:
case SCR_PUNISHMENT:
return(10);
break;
case SCR_CONFUSE_MONSTER:
return(12);
break;
case SCR_IDENTIFY:
return(14);
break;
case SCR_ENCHANT_ARMOR:
case SCR_REMOVE_CURSE:
case SCR_ENCHANT_WEAPON:
return(16);
break;
case SCR_SCARE_MONSTER:
case SCR_TAMING:
case SCR_TELEPORTATION:
return(20);
break;
case SCR_GENOCIDE:
return(30);
break;
case SCR_BLANK_PAPER:
default:
impossible("You can't write such a weird scroll!");
}
return(1000);
}
dowrite(pen)
register struct obj *pen;
{
register struct obj *paper;
char namebuf[BUFSZ], scrbuf[BUFSZ];
register struct obj *newscroll;
extern struct obj *readobjnam(), *addinv();
int basecost, actualcost;
int newquan;
if(!pen)
return(0);
if(pen->otyp != MAGIC_MARKER) {
pline("You can't write with that!");
return(0);
}
/* get paper to write on */
paper = getobj("?","write on");
if(!paper)
return(0);
if(!(objects[paper->otyp].oc_name_known)) {
pline("In your haste, you rip the scroll to pieces.");
useup(paper);
return(1);
}
# ifndef KAA
/* If this is included, the strategy would be to name all scrolls so that
* you can test them for blankness with a magic marker. This is tedious,
* thus, let's make it easier. */
if(!(objects[paper->otyp].oc_name_known)) {
pline("In your haste, you rip the scroll to pieces.");
useup(paper);
return(0);
}
# endif
if(paper->otyp != SCR_BLANK_PAPER) {
pline("You fool, that scroll's not blank!");
return(0);
}
/* what to write */
pline("What do you want to write? ");
getlin(namebuf);
if(namebuf[0] == '\033' || !namebuf[0])
return(0);
strcpy(scrbuf,"scroll of ");
strcat(scrbuf,namebuf);
newscroll = readobjnam(scrbuf);
if(newscroll->olet != SCROLL_SYM ||
newscroll->otyp == SCR_BLANK_PAPER) {
pline("You can't write that!");
pline("It's obscene!");
return(0);
}
/* see if there's enough ink */
basecost = cost(newscroll);
if(pen->spe < basecost/2) {
pline("You marker is too dried out to write that!");
obfree(newscroll, (struct obj *) 0);
return(0);
}
/* we're really going to write now, so calculate
* cost and useup old scroll
*/
actualcost = rn1(basecost/2,basecost/2);
useup(paper);
/* dry out marker */
if(pen->spe < actualcost) {
pline("Your marker dries out!");
pline("The scroll is now useless and disappears!");
pen->spe = 0;
obfree(newscroll, (struct obj *) 0);
return(1);
}
pen->spe -= actualcost;
# ifdef KAA /* Since the KAA modification allows writing on unknown blank
paper, identify blank paper. */
objects[SCR_BLANK_PAPER].oc_name_known=1;
# endif
/* can't write if we don't know it - unless we're lucky */
if(!(objects[newscroll->otyp].oc_name_known) &&
# ifdef KAA
!(objects[newscroll->otyp].oc_uname) &&
# endif
((pl_character[0] == 'W' && rn2(3)) ||
(pl_character[0] != 'W' && rn2(10)))) {
pline("You don't know how to write that!");
pline("You write \"Shah was here!\" and the scroll disappears.");
obfree(newscroll, (struct obj *) 0);
return(1);
}
/* and now you know it! */
objects[newscroll->otyp].oc_name_known = 1;
/* success - don't forget to fool prinv() */
newscroll = addinv(newscroll);
newquan = newscroll->quan;
newscroll->quan = 1;
prinv(newscroll);
newscroll->quan = newquan;
return(1);
}
# endif /* MARKER /**/